package linker

import (
	"fmt"
	"os"
	"risc-v/ld/pkg/utils"
)

// File 存储文件相关信息
// 文件名、内容等信息
type File struct {
	Name    string
	Content []byte
	Parent  *File
}

// MustNewFile 打开指定文件
func MustNewFile(filepath string) *File {
	if len(filepath) == 0 {
		fmt.Println("file name is empty")
		os.Exit(1)
	}

	content, err := os.ReadFile(filepath)
	utils.MustNo(err)

	return &File{
		Name:    filepath,
		Content: content,
	}
}

// OpenLibrary 打开静态库文件
func OpenLibrary(filepath string) *File {
	contents, err := os.ReadFile(filepath)
	if err != nil {
		return nil
	}

	return &File{
		Name:    filepath,
		Content: contents,
	}
}

// FindLibrary 从静态库库路径中找到 libname.a 的库文件
func FindLibrary(ctx *Context, name string) *File {
	for _, path := range ctx.Args.LibraryPaths {
		item := path + "/lib" + name + ".a"
		if f := OpenLibrary(item); f != nil {
			return f
		}
	}

	utils.Fatal("found library error")
	return nil
}
